package com.yeswater.redis7.filter;

import com.yeswater.redis7.Constant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Description: 布隆过滤器白名单工具类 只添加 不删除
 * @author： yeswater
 * @create： 2024/6/28
 */

@Component
@Slf4j
public class MyBloomFilter {
	@Resource
	private RedisTemplate redisTemplate;
	
	/**
	 * @param key 添加到白名单
	 */
	public void addWhitelistCustomer(String key) {
		long offset = getOffset(key);
		log.info("{} 对应------坑位 index:{}", key, offset);
		redisTemplate.opsForValue().setBit(Constant.WHITELIST_CUSTOMER, offset, true);
	}
	
	/**
	 * @param key 是否在白名单中
	 */
	public boolean checkWhitelistCustomer(String key) {
		long offset = getOffset(key);
		boolean existOK = redisTemplate.opsForValue().getBit(Constant.WHITELIST_CUSTOMER, offset);
		log.info("----->key:{}  对应坑位index:{}    是否存在:{}", key, offset, existOK);
		return existOK;
	}
	
	/**
	 * hash + 取模 => offset
	 */
	private long getOffset(String key) {
		//1. hash
		int hashValue = Math.abs(key.hashCode());
		//2. mod 
		return (long) (hashValue % Math.pow(2, 32));
	}
}
